/**
 * @file TcpConnection.hpp
 * @brief TCP连接类的声明
 * @details 封装了TCP连接的收发操作和回调处理
 */

#ifndef __TcpConnection_H__
#define __TcpConnection_H__
#include "logger.hpp"
#include "TLV.hpp"
#include "InetAddress.hpp"
#include "Socket.hpp"
#include "SocketIO.hpp"
#include <memory>
#include <functional>

namespace wd
{

class EventLoop;
class TcpConnection;
using TcpConnectionPtr =std::shared_ptr<TcpConnection>;
using TcpConnectionCallback=std::function<void(TcpConnectionPtr)>;

/**
 * @class TcpConnection
 * @brief TCP连接类
 * @details 管理单个TCP连接，处理消息收发和连接生命周期
 *          继承enable_shared_from_this以支持shared_ptr
 */
class TcpConnection
//当TcpConnection继承了辅助类后，就拥有了shared_from_this()成员函数
//该函数可以通过this指针获取到本对象的智能指针shared_ptr
: public std::enable_shared_from_this<TcpConnection>
{
public:
    /**
     * @brief 构造函数
     * @param fd socket文件描述符
     * @param loop 事件循环指针
     * @param mylogger 日志对象引用
     */
    TcpConnection(int fd, EventLoop *,MyLogger &);
    ~TcpConnection();
    
    /**
     * @brief 检查连接是否已关闭
     * @return 已关闭返回true，否则返回false
     */
    bool isClosed() const;
    
    /**
     * @brief 接收消息（按行接收）
     * @return 接收到的字符串
     */
    string receive();
    
    /**
     * @brief 读取数据包
     * @param packet 用于存储读取的数据包
     * @return 读取的字节数
     */
    int readPacket(Packet &packet);
    
    /**
     * @brief 发送消息
     * @param msg 要发送的消息
     */
    void send(const string & msg);
    
    /**
     * @brief 在事件循环中发送消息
     * @param msg 要发送的消息
     */
    void sendInLoop(const string & msg);
    
    /**
     * @brief 在事件循环中发送TLV消息
     * @param tlv TLV格式的消息
     */
    void sendInLoop(const TLV&);
    
    /**
     * @brief 获取连接的字符串表示
     * @return 连接信息字符串（本地地址->对端地址）
     */
    string toString() const;
    
    /**
     * @brief 关闭连接
     */
    void shutdown();

    /**
     * @brief 注册三个回调函数
     * @param cb1 连接建立回调
     * @param cb2 消息到达回调
     * @param cb3 连接关闭回调
     */
    void setAllCallbacks(const TcpConnectionCallback & cb1,
                         const TcpConnectionCallback & cb2,
                         const TcpConnectionCallback & cb3)
    {
        _onConnection = cb1;
        _onMessage = cb2;
        _onClose = cb3;
    }

    /**
     * @brief 处理新连接建立回调
     */
    void handleNewConnectionCallback();
    
    /**
     * @brief 处理消息到达回调
     */
    void handleMesssageCallback();
    
    /**
     * @brief 处理连接关闭回调
     */
    void handleCloseCallback();
    
private:
    /**
     * @brief 获取本地地址
     * @return 本地地址对象
     */
    InetAddress getLocalAddr();
    
    /**
     * @brief 获取对端地址
     * @return 对端地址对象
     */
    InetAddress getPeerAddr();

private:
    Socket      _sock;              ///< socket对象
    SocketIO    _sockIO;            ///< socket IO操作对象
    InetAddress _localAddr;         ///< 本地地址
    InetAddress _peerAddr;          ///< 对端地址
    bool        _isShutdownWrite;   ///< 写端是否已关闭
    EventLoop * _loop;              ///< 所属事件循环
    MyLogger  & _mylogger;          ///< 日志对象引用
    TcpConnectionCallback _onConnection;  ///< 连接建立回调
    TcpConnectionCallback _onMessage;     ///< 消息到达回调
    TcpConnectionCallback _onClose;       ///< 连接关闭回调
};
}//end of namespace wd


#endif

